function formatDataTree(data){
    // 先区分顶级与子级
    let parents = data.filter(p=>p.pid===0),
        childrens = data.filter(c=>c.pid!==0);
        // 处理顶级与子级数据
        dataToTree(parents,childrens);
    return parents;
}
function dataToTree(parents,children){
    // 遍历顶级
    parents.map(p=>{
        // 遍历子级
        children.map((c,i)=>{
            // 如果子级pid等于顶级id
            if(c.pid===p.id){
                // 处理子级数据，深拷贝一份子级数据
                let _children = JSON.parse(JSON.stringify(children));
                    // 每处理一次都需要删除上次处理过的顶级数据
                    _children.splice(i,1);
                    // 递归处理
                    dataToTree([c],_children);
                // 如果当前顶级下存在children直接push
                if(p.children){
                    p.children.push(c);
                }else{
                    // 否则添加children树形并添加数据
                    p.children = [c];
                }
            }
        })
    })
}

// 一次处理并结构化
function formatDataTree1(data){
    // 深拷贝所有数据
    let _data = JSON.parse(JSON.stringify(data));
    // 过滤所有数据
    return _data.filter(p=>{
        // 在过滤所有pid等于id的数据
        const _arr = _data.filter(c=>{
            return c.pid === p.id;
        });
        // 如果存在子级pid等于父级id的数据 就位父级添加children属性并赋值为_arr
        _arr.length && (p.children = _arr);
        // 结构化后的数据
        return p.pid == 0;
    });
}